Skip to content

release: v0.4.26 — quota sorting, Antigravity quota buckets, Command Code, video models - #931

Merged
kittors merged 20 commits into
mainfrom
dev
Aug 19, 2026
Merged

release: v0.4.26 — quota sorting, Antigravity quota buckets, Command Code, video models#931
kittors merged 20 commits into
mainfrom
dev

Conversation

@kittors

@kittors kittors commented Aug 19, 2026

Copy link
Copy Markdown
Owner

Promotes the verified dev branch to main for v0.4.26. Pairs with CliRelay v0.4.26.

Key changes

Compatibility and upgrade notes

  • Requires CliRelay v0.4.26 for the Antigravity quota buckets and plan_type; against an older backend the panel falls back to the previous grouping through its compatibility mapping, so nothing breaks.
  • The four hard-coded Antigravity family names were removed from the locales. Rows cached under the previous grouping are mapped on read and age out on their own.
  • Sort preferences persist in localStorage per browser; no server-side state.

Verification

  • All merged dev PRs passed quality-build-e2e / test-build / vitest (2 shards).
  • Structure gates (file size / import boundaries / surface usage / design tokens) and the bundle budget pass; AuthFilesPage sits at 64 kB gzip against an 80 kB page budget.
  • Verified on the deployed panel that the new chunks carry the sort controls and all three locales.

🤖 Generated with Claude Code

kittors and others added 20 commits August 12, 2026 20:21
…model ID" hints

Three sources of the same complaint — the console showing an "alias" identical to
the name already on screen.

OverflowTooltip gated on `scrollWidth > clientWidth`. Both are rounded to
integers, so a 188.4px label in a 188px box reports a 1px overflow while
rendering in full with no ellipsis, and the tooltip opened repeating the visible
text. Add a 1px tolerance, matching what scrollMetrics.ts already does for the
same rounding.

ModelTag set a native `title` equal to the model id, stacking a browser tooltip
on top of the managed one with the same content. Only set it when a caller passes
one; truncating call sites already wrap the tag in OverflowTooltip.

The request log raised a "real model ID" hint whenever the upstream name differed
as a string. An account alias only adds a routing segment — `ollama/…:0731` for
upstream `…:0731` — so every row of an aliased provider carried the hint. Compare
model identity instead. The backend now avoids recording those names, but logs
are kept for months, so the UI normalizes historical rows too.

Provider model chips move to OverflowTooltip on the same principle: when the chip
fits, its tooltip only repeated the mapping already visible.

Model plaza source summaries are deliberately unchanged: that line is catalog
information about which id a source serves, not a per-row runtime hint.

Extracting the model cell into RequestLogModelCell also brings
requestLogsShared.tsx down from 1020 to 989 lines; baseline updated to lock it in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(ui): stop repeating model names as tooltips and alias-only "real model ID" hints
… block

Two things the console was missing.

Curl examples rendered as flat, unstyled text. The repo already had a tiny
hand-written shell tokenizer on the landing page, written precisely to avoid
dragging react-syntax-highlighter's 790KB vendor chunk in for a single block. It
moves to @code-proxy/ui as CodeBlock so the landing page, the image page and the
new video page all read the same.

The new Video Models page mirrors the image one: how-to-call docs with a
text-to-video / image-to-video switch, request and response tables, and a test
panel. The docs show both halves of the call — submit and poll — because the
polling step is the one callers miss, and generation is asynchronous upstream.
The test panel is synchronous to watch: the server task absorbs the polling, so
the panel waits and then plays the clip.

Image-page tests move from getByText on the snippet to assertions on the block's
textContent: highlighting splits the text across token spans, which is also why
CodeBlock carries a data-code-block hook.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The unit tests run in jsdom, which has no layout and no CSS, so neither the
highlighted snippet nor the model catalog wiring was actually exercised. A
browser spec caught the latter: the catch-all management mock shadowed the models
route (Playwright matches the most recently registered route first), leaving the
test panel permanently disabled — the same shape of failure a real deployment
would show if the endpoint 404'd.

Not tagged @critical, so it stays out of the per-PR smoke.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(video): add the video models page and share the highlighted code block
…nu its icon

The page offered a live "generate" button regardless of whether the tenant had an
xAI account, so the only feedback was the router's "auth_not_found: no auth
available" — true, but not actionable. The models endpoint now reports per-tenant
availability, and the page disables the action and names what is missing.
Availability absent from the response (older server) does not disable anything.

The sidebar entry fell back to the generic circle because the icon map had no
"video" key; the seed menu has always asked for one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(video): grey out generation without a credential, and give the menu its icon
…sage

Command Code joins the channels that show plan windows on their cards, but it is
the first one that needs nothing from the operator beyond the API key: its
credits endpoint authenticates with the same key that serves inference, so the
card fills in without a dashboard cookie to paste and without one to expire. The
key editor says so instead of showing a cookie field that would do nothing.

Adding it also removed the reason it was hard to add. The four usage-reporting
channels each carried their own near-identical copy of the same card tree, and
the page they lived in was frozen at its size baseline. They now share
ProviderUsageTabContent, and the usage/model-access maps moved into
provider-usage-config, which took ProvidersPageContent from 1845 to 1651 lines —
a channel now costs a call site rather than another 65-line copy.

The one baseline that moved is modelAvailability, by two lines: the channel
list there is a registry of every provider, so registering a new one is what
those lines are. features/ cannot import from pages/, and every way of deriving
the set instead of listing it came out longer once formatted.

Model definitions come from the relay, which fetches Command Code's public
catalog — no credential required — so the channel's model list stays current
without a frontend release.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(providers): add the Command Code channel with cookie-free plan usage
The Antigravity card split one upstream quota bucket into four rows by
matching model ids against a hand-written list, then labelled those
rows with four hard-coded strings from the translation catalogue. The
result was three Gemini rows showing an identical percentage and an
identical reset time, because upstream they are one bucket — and any
model missing from the list was dropped rather than shown as unknown.

Read retrieveUserQuotaSummary first, which reports the weekly and 5h
buckets per family and names them itself, and fall back to
fetchAvailableModels. Classify models for that fallback by the shape of
their id, keeping unclassified ones under their own display name. Drop
the four hard-coded family names from the locales; a mapping for keys
written by the previous grouping stays behind so cached rows still
render while they age out.

The direct fetch path now resolves the account's own project through
loadCodeAssist instead of assuming the shared fallback id, retries once
without the project field on a 403, announces a client version the
upstream still serves in full, and tries the sandbox host first.

The card keeps showing the 5h window only; the weekly buckets reach the
detail panel, which already splits its trend by window width.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(antigravity): render the upstream's own quota buckets
Channels that report plan usage — opencode-go, cline, ollama-cloud and
commandcode — can hold many credentials, and the one an operator wants is
whichever still has headroom. Finding it meant reading every card.

Adds a sort control to those tabs: configured order (default), least
quota left first, or most quota left first.

A credential's position is decided by its tightest window, not its
average or its widest. A key with a comfortable monthly allowance but a
spent 5-hour window is unusable right now, and sorting it as though it
were plentiful would defeat the point of the feature.

Credentials with no reading sort last in both directions. Usage is
fetched per credential on demand, so "unknown" is common; treating it as
either full or empty would push the credentials worth looking at off the
first screen.

The list is reordered by passing positions, not by reordering the array.
The index the card list hands to onEdit, onDelete and renderExtra
identifies the credential in the saved config and keys its usage cache,
so a genuinely reordered array would edit one credential while showing
another's quota. A malformed order degrades to configured order rather
than dropping or duplicating cards.

The preference is module-scoped and persisted, following the active-tab
pattern: the four usage tabs cannot disagree about the order, and it
survives a reload. It is deliberately not lifted into ProvidersPageContent,
which is already over its size budget and would have grown further.

No backend change: plan usage is fetched client-side per credential and
cached there, so ordering is a view concern with no server-side input.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(providers): sort credentials by remaining quota
The bundle gate fails on every PR opened against dev right now, and the
failing branch is not the cause.

`AuthFilesPage` is recorded at 58.90 kB gzip while dev actually builds it
at 64.36 kB — 5.46 kB past the 5 kB delta tolerance. Verified by building
dev with no local changes at all: the gate reports the same +5.46 kB and
the same FAIL, so any branch inherits it.

The drift is in the record, not in the budget: at 64.36 kB the chunk is
still well under the 80 kB page budget, with roughly 15 kB of headroom.
Nothing here relaxes the budget or the tolerance; the recorded number is
simply brought up to what dev produces, so the tolerance starts measuring
new growth again instead of re-reporting growth that already landed.

Chunk governance for this page is still worth doing — it is the largest
page chunk — but that is a separate change from unblocking the gate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chore(bundle): align the AuthFilesPage baseline with dev
The AI accounts list could only be ordered by name. With many accounts,
finding one that still has headroom meant reading every card.

Adds a sort control to the toolbar: by name (default), least quota left
first, most quota left first.

An account's position is decided by the tightest quota its card actually
shows. Scoping it to the visible slots matters: antigravity reports both
a 5h and a weekly bucket but the card renders only the 5h one, and
ranking by a number the operator cannot see reads as a broken sort.

Sorting pulls the full status snapshot once. The list loads status only
for the accounts on the current page — correct for rendering, useless for
ordering, since sorting a page by numbers only that page has just
shuffles it. The endpoint already returns every account when no
auth_index filter is given, so no backend change was needed. The order is
applied before the slice into pages.

Accounts with no reading sort last in both directions and keep name order
among themselves. Unknown is not empty and not full; floating it to the
top of either direction would bury what the operator opened the view to
find. A failed snapshot leaves everything unranked, which preserves name
order rather than presenting a partial order as authoritative.

The preference and the fetch state are module-scoped and the preference
is persisted. AuthFilesPage.tsx and AuthFilesFilesTab.tsx are both frozen
at their size baselines, so threading this through as props was not
available; the list and the toolbar control read the shared value
independently. Neither file is touched by this change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Matches the column-count control it sits beside — same affordance for the
same kind of choice, and no second popover implementation on a toolbar
that already has one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(ai-accounts): sort accounts by remaining quota
@kittors
kittors merged commit af4ee78 into main Aug 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant